import Request from '@/plugin/luch-request/index.js'
import {
	ACCESS_TOKEN
} from '@/common/util/constants.js'
import configService from './config.service.js'
import Tip from '@/common/util/tip.js';
import { TipMap } from '../contants/tip.js';

// uni缓存存储用户 token
const getTokenStorage = () => {
	let token = uni.getStorageSync(ACCESS_TOKEN) || ""
	return token
}

const http = new Request();

http.setConfig((config) => {
	/* 设置全局配置 */
	config.baseUrl = configService.apiUrl /* 根域名不同 */
	config.header = {
		...config.header
	}
	return config
})

/**
 * 自定义验证器，如果返回true 则进入响应拦截器的响应成功函数(resolve)，否则进入响应拦截器的响应错误函数(reject)
 * @param { Number } statusCode - 请求响应体statusCode（只读）
 * @return { Boolean } 如果为true,则 resolve, 否则 reject
 */
// 有默认，非必写
http.validateStatus = (statusCode) => {
	return statusCode === 200
}

http.interceptor.request((config, cancel) => {
	/* 请求之前拦截器 */
	config.header = {
		...config.header,
		'Hula-Access-Token': getTokenStorage()
	}
	
	// if (!token) { // 如果token不存在，调用cancel 会取消本次请求，但是该函数的catch() 仍会执行
	//   cancel('token 不存在') // 接收一个参数，会传给catch((err) => {}) err.errMsg === 'token 不存在'
	// }
	
	return config
})

// 必须使用异步函数，注意
http.interceptor.response(
	async (response) => {
			const { code, message } = response.data
			if (code !== 200) {
				switch (code) {
					case 401: // 兼容
					case 20401:
						uni.setStorageSync(ACCESS_TOKEN, "")
						uni.showModal({
							content: '您还没有登录，是否前往登录页面？',
							confirmText: '确定',
							cancelText: '取消',
							success(res) {
								if (res.confirm) {
									uni.navigateTo({
										url: '/pages/login/login'
									})
								}
							}
						});
						break;
					case 400: // 后续删除
						Tip.error(message)
						break;
					default:
						if(TipMap[code].show) {
							Tip[TipMap[code].type](message)
						}
						break;
				}
			}
			return response.data
		},
		(err) => {
			console.log("错误",err)
			if (err) {
				switch (err.code) {
					case 403:
						Tip.error('拒绝访问');
						break
					case 500:
						break
					case 404:
						break
					case 504:
						break
					case 401:
						break
					default:
						Tip.error(err.message);
						break
				}
			}
			return err
		})

export default http;
